package com.michael.study.listview

import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.SnapHelper

/**
 * Description:
 *
 * Created by liuguoquan on 2020/7/30 22:28.
 */
class CustomLayoutManager : RecyclerView.LayoutManager() {

    /**
     * RecyclerView Item的布局参数，换种说法，就是RecyclerView 子 item 的 LayoutParameters，
     * 若是想修改子Item的布局参数（比如：宽/高/margin/padding等等），那么可以在该方法内进行设置。
     * 一般来说，没什么特殊需求的话，则可以直接让子item自己决定自己的宽高即可
     */
    override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams {
        return RecyclerView.LayoutParams(
            RecyclerView.LayoutParams.WRAP_CONTENT,
            RecyclerView.LayoutParams.WRAP_CONTENT
        )
    }


    /**
     * 在LayoutManager中，所有Item的布局都是在onLayoutChildren()函数中处理的
     */
    override fun onLayoutChildren(recycler: RecyclerView.Recycler?, state: RecyclerView.State?) {
        //定义竖直方向的偏移量
        var offsetY = 0
        for (i in 0 until itemCount) {
            var view = recycler?.getViewForPosition(i);
            //把所有的item所对应的view加进来
            addView(view)
            view?.let {
                //函数测量这个view
                measureChildWithMargins(it, 0, 0)
                //测量出来的宽度  得到的是item+decoration的总宽度
                // 如果你只想得到view的测量宽度，通过view.getMeasuredWidth()就可以得到了
                var width = getDecoratedMeasuredWidth(it)
                var height = getDecoratedMeasuredHeight(it)
                //将每个item摆放在对应的位置，每个Item的左右位置都是相同的，从左侧x=0开始摆放，只是y的点需要计算。
                // 所以这里有一个变量offsetY，用以累加当前Item之前所有item的高度。从而计算出当前item的位置
                layoutDecorated(view, 0, offsetY, width, offsetY + width)
                offsetY += height
            }

        }

        //如果所有子View的高度和没有填满RecyclerView的高度，
        // 则将高度设置为RecyclerView的高度
        mTotalHeight = Math.max(offsetY, getVerticalSpace());

    }

    private var mTotalHeight = 0;

    private fun getVerticalSpace(): Int {
        return height - paddingBottom - paddingTop
    }


    /**
     * LayoutManager具有垂直滚动的功能
     */
    override fun canScrollVertically(): Boolean {
        return true
    }

    private var mSumDy = 0

    /**
     * ,在scrollVerticallyBy中,dy表示手指在屏幕上每次滑动的位移.

    当手指由下往上滑时,dy>0
    当手指由上往下滑时,dy<0
     */
    override fun scrollVerticallyBy(
        dy: Int,
        recycler: RecyclerView.Recycler?,
        state: RecyclerView.State?
    ): Int {
        //如果滑动到最顶部
        var travel = dy
        if (mSumDy + dy < 0) {
            travel = -mSumDy;
        } else if (mSumDy + dy > mTotalHeight - getVerticalSpace()) {
            //如果滑动到最底部
            travel = mTotalHeight - getVerticalSpace() - mSumDy;
        }

        mSumDy += travel;

        //Log.d("lgq", "scrollVerticallyBy: " + travel)

        //// 平移容器内的item
        offsetChildrenVertical(-travel)
        return dy
    }



}